首页

micro agent

一个使用ts实现的微小而强大的 agent ,可以移植到任何地方进行使用
主要应用场景:嵌入各个网站,让原有网站在简单改造后即可拥有ai对话以及 agent 自动化操作能力,例如表单填写,数据筛选提取。网站只需声明一些tools,以及配置一些提示词。
ai 只能支持输入and输出
agent 是利用大模型来实现动态编码程序的一种形式。
编码的优点通常在于运行效率高
动态编码则是减少人工开发时间,同时得到运行速度快的方案
大模型的注意力机制就决定了你输入的约束条件越多,它遗忘和丢失关键信息的概率就越大。
如果你不够聪明的话,折腾来折腾去,你得很久以后才会发现,纯净上下文的 model 比任何狗屁方法论都好用,model 的基础能力才是一切。

Agent 架构说明

整体架构

这是一个 ​Tool-Use Agent​(工具调用型 Agent),运行在 WPS 加载项的 webview 中。核心设计思想是:​让 LLM 通过唯一的 bash工具在虚拟终端中执行 CLI 命令,间接操作 WPS 文档​。
┌─────────────────────────────────────────────────┐ │ index.vue (UI 层) │ │ - 用户输入、日志展示、暂停/停止/撤回控制 │ │ - LLM 提供商选择、SSE 流式解析 │ │ - 文档选区自动轮询 │ └──────────────┬──────────────────────────────────┘ │ runAgentLoop(config, signal) ▼ ┌─────────────────────────────────────────────────┐ │ agentLoop.ts (主循环) │ │ - LLM ↔ Tool 循环 (最多 80 轮) │ │ - 上下文压缩 (compactMessages) │ │ - 连续失败反思、空响应重试 │ │ - Todo 未完成阻止退出 │ │ - 技能切换 (switch_skill) │ └──────────┬──────────────────┬───────────────────┘ │ │ ▼ ▼ ┌──────────────────┐ ┌──────────────────────────┐ │ agentCore.ts │ │ virtualBash.ts │ │ - 类型定义 │ │ - 命令行解析器 │ │ - token 估算 │ │ - 管道 | / 链式 && || │ │ - 上下文压缩 │ │ - 内置文本工具 │ │ - 错误分类 │ │ - 模糊匹配 & 弱模型回退 │ │ - SkillConfig │ │ - 变量展开 ($VAR, $?) │ └──────────┬───────┘ └──────────┬────────────────┘ │ │ ▼ ▼ ┌─────────────────────────────────────────────────┐ │ Skills (技能层) │ │ ┌──────────────┐ ┌──────────────────────────┐ │ │ │ paibanSkill │ │ writeSkill │ │ │ │ 公文排版 │ │ 公文写作 │ │ │ │ 11个CLI命令 │ │ 流式写入+writeDoc命令 │ │ │ └──────┬───────┘ └──────────┬───────────────┘ │ └─────────┼─────────────────────┼─────────────────┘ │ │ ▼ ▼ ┌─────────────────────────────────────────────────┐ │ cli/ (CLI 命令层, ~15 个命令) │ │ doc, fmt, batch, margin, font, para, head, │ │ search, find, split, selection, writeDoc, │ │ report, history, env, todo, help, switch_skill │ └──────────────────┬──────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────┐ │ docOperationLayer.ts (文档操作抽象层) │ │ - 写前自动选中 + 滚动队列(去重) │ │ - 写前快照 + 写后验证 │ │ - 生命周期钩子 (beforeWrite/afterWrite/onError) │ └──────────────────┬──────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────┐ │ wpsTools.ts (WPS API 封装) │ │ - 段落查看/排版/字体/格式/搜索/替换/删除/写入 │ │ - 格式预设 (国标公文格式) │ │ - Markdown 加粗语法处理 │ └──────────────────┬──────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────┐ │ WPS Document API (window.Application) │ └─────────────────────────────────────────────────┘

核心设计模式

1. 单一工具 + 虚拟终端
LLM 只暴露一个 bash​ function tool,所有能力通过虚拟终端命令实现。这是一种经典的 Agent 设计,好处是:
简化 LLM 的工具选择(只有一个工具)
通过管道和链式组合实现复杂操作
命令历史、错误恢复等在终端层面统一处理
2. Skill 技能系统
通过 SkillConfig​ 接口定义可插拔的技能模块,当前有两个技能:
paibanSkill — 公文排版(11 个 CLI 命令)
writeSkill — 公文写作(1 个 CLI 命令 + 流式写入)
Agent 启动时所有技能的命令都注册到 CLI 中,LLM 通过 switch_skill​ 命令切换,切换后注入对应的系统提示词。
3. 多层上下文压缩​(agentCore.ts
参考了多篇 Agent 优化论文实现了一套渐进式压缩策略:
Tool Result Clearing​(自适应轻量压缩):保留最近 N 条完整、渐进压缩更早的、激进压缩最旧的
错误记录保护​(P9-C/Manus):错误记录保留更多行,防止模型"忘记教训"
轨迹去重​(P10-B/AgentDiet):合并连续重复的 tool 调用
结构化摘要​:压缩时生成包含 session intent + 进度 + 操作脉络的摘要
4. 文档操作抽象层​(docOperationLayer.ts
在 CLI 命令和 WPS API 之间增加了中间层:
写操作前自动选中目标 range(视觉反馈)
滚动队列去重(高频排版时避免反复滚动)
写前快照 + 写后验证(类似 Claude Code 的"先读再写")
生命周期钩子支持
5. 弱模型容错​(virtualBash.ts
模糊匹配(Levenshtein 距离 ≤ 2)
从文本中提取命令(处理弱模型不生成 tool call 的情况)
错误分类(deterministic/transient/capability)+ 修复建议

评估

优点

1.
架构清晰,分层合理 — 从 UI → 循环 → 虚拟终端 → CLI → 操作层 → WPS API,每一层职责明确,耦合度低
2.
上下文工程做得扎实 — 参考了多篇论文(Manus/AgentDiet/LangChain Deep Agents),渐进式压缩策略比简单截断效果好很多
3.
容错机制完善 — 模糊匹配、弱模型回退、错误分类、连续失败反思、空响应重试等多层容错
4.
Skill 系统可扩展 — 新技能只需实现 SkillConfig​ 接口即可接入,命令去重机制也考虑到了
5.
文档操作层设计好 — 写前快照 + 写后验证 + 滚动去重 + 生命周期钩子,既保证了正确性又兼顾了用户体验

可改进方向

1.
单工具瓶颈 — 所有命令走一个 bash​ 工具,LLM 需要自己拼命令字符串,容易出现格式错误。对于核心操作(doc/fmt/batch/writeDoc)可以考虑暴露为独立 tool,减少命令构造失败
2.
错误恢复未充分利用classifyError​ 定义了很好的三层错误分类(deterministic/transient/capability),但 agentLoop.ts​ 中只用了 consecutiveFailures​ 计数,没有根据 ErrorCategory​ 做差异化处理(比如 deterministic 直接给修复建议而不计入失败)
3.
writeSkill 的流式写入状态管理脆弱lastStreamLen​ 用增量截取处理累积文本,如果 LLM 流式中途改变前文(虽然少见),会导致内容不一致
4.
缺少并行 tool\_call 支持 — 当前循环中 toolCalls 是顺序执行的(for (const tc of toolCalls)​),而 LLM 可能一次返回多个 tool_calls,并行执行可以显著提升效率(比如 margin && doc​ 可以并行)
5.
LLM 调用层和 UI 层耦合createLlmCaller​ 在 index.vue​ 中定义,包含了 SSE 解析、联通 API 适配、重试逻辑等,职责较重。可以抽到独立的 llmService.ts
6.
缺少可观测性 — 没有结构化的性能指标采集(每轮 LLM 耗时、token 使用量、命令成功率等),对后续优化缺少数据支撑
7.
测试覆盖 — 存在测试文件(agentCore/agentBenchmark/agentIntegration),但核心的 agentLoop​ 和 wpsTools​ 因依赖 WPS API 难以测试,docOperationLayer 的 mock 策略值得进一步完善

总体评价

这是一个​工程质量较高的 Tool-Use Agent 实现​,特别是上下文压缩和文档操作抽象层的设计展现了较深的思考。架构上借鉴了 Claude Code 等成熟产品的设计理念(虚拟终端、先读再写、结构化日志),并结合 WPS 文档操作场景做了合理的适配。当前最适合的场景是公文排版和写作这类操作步骤明确、命令可枚举的任务。如果要扩展到更复杂的文档处理场景,建议优先解决并行 tool_call 和独立 tool 暴露的问题。